// 文件操作
// 文件通常分为两类 文本文件 二进制文件

// package main

// import (
// 	"fmt"
// 	"io/ioutil"
// 	"os"
// 	"path/filepath"
// )

// /*
// ReadDir
// @author liangang
// */
// // 获取指定目录下的所有文件， 不进入下一级目录搜索
// func ListDir(dirPath string) error {
// 	dir, err := ioutil.ReadDir(dirPath)
// 	if err != nil {
// 		return err
// 	}
// 	for _, fi := range dir {
// 		if fi.IsDir() {
// 			fmt.Println("目录：", fi.Name())
// 		} else {
// 			fmt.Println("文件：", fi.Name())
// 		}
// 	}
// 	return nil
// }

// // 遍历路径下所有目录
// func WalkDir(path string) {
// 	err := filepath.Walk(path, func(path string, f os.FileInfo, err error) error {
// 		if f == nil {
// 			return err
// 		}
// 		if f.IsDir() {
// 			// print(path)
// 			return nil
// 		}
// 		println(path)
// 		return nil
// 	})
// 	if err != nil {
// 		fmt.Printf("filepath.Walk() returned %v\n", err)
// 	}
// }

// func main() {
// 	// dir, err := ioutil.ReadDir("c:\\Users")
// 	// if err != nil {
// 	// 	fmt.Println(err)
// 	// }
// 	// for id, file := range dir {
// 	// 	// fmt.Println(id)
// 	// 	fmt.Println(file.Name())
// 	// }
// 	// fmt.Println(dir)
// 	// ListDir("c:\\Users")

// 	WalkDir("C:\\Windows\\Temp")
// }

// 创建目录
// package main

// import (
// 	"fmt"
// 	"os"
// )

// func createDir(path string, dirName string) {
// 	dirPath := path + "\\" + dirName
// 	err := os.Mkdir(dirPath, 0777) // 单级目录
// 	if err != nil {
// 		fmt.Println(err)
// 	}
// 	os.Chmod(dirPath, 0777)
// 	fmt.Println("Create Dir => " + path + " " + dirName)
// }

// func createDirAll(path string, dirName string) {
// 	dirPath := path + "\\" + dirName
// 	fmt.Println("Create Dir =>" + dirPath)
// 	err := os.MkdirAll(dirPath, 0777)
// 	if err != nil {
// 		fmt.Println(err)
// 	} else {
// 		fmt.Println("Create Success")
// 	}
// 	os.Chmod(dirPath, 0777)
// }

// func deleteEmptyDir(dirPath string) {
// 	// 只能删除空目录
// 	fmt.Println("Delete Dir => " + dirPath)
// 	err := os.Remove(dirPath)
// 	if err != nil {
// 		fmt.Println(err)
// 	} else {
// 		fmt.Println("Delete Success!")
// 	}
// }

// func deleteNotEmptyDir(dirPath string) {
// 	fmt.Println("Delete Dir => " + dirPath)
// 	err := os.RemoveAll(dirPath)
// 	if err != nil {
// 		fmt.Println(err)
// 	} else {
// 		fmt.Println("Delete Success!")
// 	}
// }

// func main() {
// createDir("C:\\Windows\\Temp", "test")
// createDir("C:\\Windows\\Temp\\test", "test2")
// createDir("C:\\Windows\\Temp", "test")
// createDirAll("C:\\Windows\\Temp", "dir1\\dir2\\dir3")
// deleteEmptyDir("C:\\Windows\\Temp\\test")
// deleteNotEmptyDir("C:\\Windows\\Temp\\test")

// 以读写方式打开文件，如果不存在则创建
// 	file, err := os.OpenFile("C:\\Windows\\Temp\\go_test.txt", os.O_RDWR|os.O_CREATE, 0766)
// 	if err != nil {
// 		fmt.Println(err)
// 	}
// 	fmt.Println(file)
// 	file.Close()
// }

// // 文件读取
// package main

// import (
// 	"fmt"
// 	"os"
// )

// func ReadFile(path string) {
// 	file, err := os.Open(path)
// 	if err != nil {
// 		fmt.Println(err)
// 	}
// 	buf := make([]byte, 1024)
// 	fmt.Println("以下是文件内容:")
// 	for {
// 		len, _ := file.Read(buf)
// 		if len == 0 {
// 			break
// 		}
// 		fmt.Println(string(buf))
// 	}
// 	file.Close()
// }

// func ReadFile2(path string) {
// 	file, err := os.Open(path)
// 	if err != nil {
// 		fmt.Println(err)
// 	}
// 	buf := make([]byte, 1024)
// 	fmt.Println("以下是文件内容:")
// 	_, _ = file.ReadAt(buf, 9)
// 	fmt.Println(string(buf))
// 	_ = file.Close()
// }

// func main() {
// 	ReadFile2("C:\\Windows\\Temp\\go_test.txt")
// }

// 文件写入
// Write WriteAt 写入数据时 会覆盖原有数据
// package main

// import (
// 	"fmt"
// 	"os"
// 	"strconv"
// )

// func main() {
// 	file, err := os.Create("C:\\Windows\\Temp\\go_test.txt")
// 	if err != nil {
// 		fmt.Println(err)
// 	}
// 	data := "我是藤原书记\r\n"
// 	for i := 0; i < 3; i++ {
// 		// file.Write([]byte(data))
// 		// 按指定偏移量写入书记
// 		ix := i * 64
// 		file.WriteAt([]byte(data+strconv.Itoa(i)+"\r\n"), int64(ix))
// 	}
// 	file.Close()
// }

// 删除文件

// package main

// import (
// 	"fmt"
// 	"os"
// )

// func main() {
// 	// 删除文件
// 	err := os.Remove("C:\\Windows\\Temp\\go_test.txt")
// 	if err != nil {
// 		fmt.Println(err)
// 	} else {
// 		fmt.Println("Delete Success")
// 	}

// 	// 删除指定路径下所有文件
// 	err = os.RemoveAll("C:\\Windows\\Temp\\test")
// 	if err != nil {
// 		fmt.Println(err)
// 	} else {
// 		fmt.Println("Delete Success")
// 	}

// }

// 处理 JSON 文件
// package main

// import (
// 	"encoding/json"
// 	"fmt"
// )

// func main() {
// 	m := make(map[string]interface{}, 6)
// 	m["name"] = "小王"
// 	m["age"] = 24
// 	m["sex"] = true
// 	m["birthday"] = "1991-10-27"
// 	m["company"] = "湖南科大"
// 	m["language"] = []string{"Go", "PHP", "Python"}

// 	result, _ := json.Marshal(m)
// 	resultFormat, _ := json.MarshalIndent(m, "", "  ")
// 	fmt.Println("result =", string(result))
// 	fmt.Println("resultFormat =", string(resultFormat))
// }

// 使用 struct  快速json编码
// package main

// import (
// 	"encoding/json"
// 	"fmt"
// )

// type Person struct {
// 	Name     string   `json:"name"`
// 	Age      int      `json:"age:`
// 	Sex      bool     `json:"sex"`
// 	Birthday string   `json:"birthday"`
// 	Company  string   `json:"company"`
// 	Language []string `json:"language"`
// }

// func main() {
// 	person := Person{
// 		"小王",
// 		24,
// 		true,
// 		"1991-10-27",
// 		"湖南科大",
// 		[]string{"Go", "Php", "Python"},
// 	}
// 	// result, err := json.Marshal(person)
// 	result, err := json.MarshalIndent(person, ",", "  ")

// 	if err != nil {
// 		fmt.Println(err)
// 	}
// 	fmt.Println("result =", string(result))
// }

// 解码json
package main

import (
	"encoding/json"
	"fmt"
)

type Person struct {
	Name     string   `json:"name"`
	Age      int      `json:"age"`
	Sex      bool     `json:"sex"`
	Birthday string   `json:"birthday"`
	Company  string   `json:"company"`
	Language []string `json:"language"`
}

func encodJsonByMap(jsonStr string) {
	m := make(map[string]interface{}, 6)
	err := json.Unmarshal([]byte(jsonStr), &m)
	if err != nil {
		fmt.Println(err)
	}
	// 类型断言
	for key, value := range m {
		switch data := value.(type) {
		case string:
			fmt.Printf("map [%s]的值类型为string, value = %s\n", key, data)
		case float64:
			fmt.Printf("map[%s]的值类型为int, value =%v\n", key, int(data))
		case bool:
			fmt.Printf("map[%s]的值类型为bool, value =%t\n", key, data)
		case []string:
			fmt.Printf("map[%s]的值类型为[]string, value =%v\n", key, data)
		case []interface{}:
			fmt.Printf("map[%s]的值类型为[]interface{}, value =%v\n", key, data)
		}
	}
}

func main() {
	jsonStr := `
	{ 
		"name":"小王",
		"age":24,
		"sex":true,
		"birthday":"1991-10-27",
		"company":"湖南科大",
		"language": ["Go", "Php", "Python"]
	}
	`
	// 自定义 json解析 操作繁琐
	// encodJsonByMap(jsonStr)

	// 通过json库来解析 或者fastjson
	var person Person
	err := json.Unmarshal([]byte(jsonStr), &person)
	if err != nil {
		fmt.Println(err)
	}
	fmt.Printf("person = %+v", person)
	fmt.Println(jsonStr)
}
